/**
 * @desc 字符串化数字
 *
 * @param Number n 数字
 *
 * @returns String 数字[3->03,11->11]
 */
function formatNumber(n) {
  n = n.toString();
  return n[1] ? n : '0' + n;
};
/**
 * @desc 格式化日期
 *
 * @param Date date 日期对象
 *
 * @returns String  日期字符串[2017/04/18 20:30:00]
 */
function formatTime(date) {
  var year = date.getFullYear();
  var month = date.getMonth() + 1;
  var day = date.getDate();

  var hour = date.getHours();
  var minute = date.getMinutes();
  var second = date.getSeconds();

  return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':');
};
/**
 * @desc 格式化日期
 *
 * @param Date date 日期对象
 *
 * @returns String  日期字符串[ 20:30:00 ]
 */
function toTimeString(date, joint) {
  if (!date) return '';
  var hour = date.getHours();
  var minute = date.getMinutes();
  var second = date.getSeconds();
  if (hour < 10) {
    hour = "0" + hour;
  }
  if (minute < 10) {
    minute = "0" + minute;
  }
  if (second < 10) {
    second = "0" + second;
  }
  return hour + joint + minute + joint + second;
};

/**
 * @desc 中文格式化日期
 *
 * @param {} date  日期对象
 *
 * @returns String 日期字符串(2017年4月18日)
 */
function getDateStr(date) {
  if (!date) return '';
  var years = date.getFullYear();
  var month = date.getMonth() + 1;
  var data = date.getDate();
  if (month < 10) {
    month = "0" + month;
  }
  if (data < 10) {
    data = "0" + data;
  }
  return years + '年' + month + '月' + data + '日';
}
/***
 * 使用指定字符连接年月日
 * @param date 日期对象
 * @param joint 连接字符串
 * @returns {*}
 */
function toDateString(date, joint) {
  if (!date) return '';
  let month = ((date.getMonth() + 1)) > 9 ? (date.getMonth() + 1) : ('0' + (date.getMonth() + 1));
  let day = ((date.getDate())) > 9 ? (date.getDate()) : ('0' + date.getDate());
  return date.getFullYear() + joint + month + joint + day;
}
/**
 * @desc 中文格式化日期
 *
 * @param {} date  日期对象
 *
 * @returns String 日期字符串(2017-4-18)
 */
function formatDateStr(date) {
  if (!date) return '';
  return date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate();
}

/**
 * @desc 中文格式化日期
 *
 * @param {} date  日期对象
 *
 * @returns String 日期字符串(2017-4-18)
 */
function formatDateStandard(date) {
  if (!date) return '';
  let m = date.getMonth() + 1;
  let d = date.getDate();
  return date.getFullYear() + '-' + (m < 10 ? ('0' + m) : m) + '-' + (d < 10 ? ('0' + d) : d);
}
/***
 * 获取域名
 */
function getOrigin() {
  let origin = location.origin;
  if (origin.indexOf('localhost') > -1) {
    origin = 'http://test.hemaquan.com';
  }
  return origin;
}
/**
 * @desc {}转成url参数
 *
 * @param param    转换的对象
 * @param key      参数前缀(a.)
 * @param encode
 *
 * @returns String 参数结果
 */
function urlEncode(param, key, encode) {
  if (param === null) {
    return '';
  }
  var paramStr = '';
  var t = typeof (param);
  if (t === 'string' || t === 'number' || t === 'boolean') {
    paramStr += '&' + key + '=' + ((encode == null || encode) ? encodeURIComponent(param) : param);
  } else {
    for (var i in param) {
      var k = key == null ? i : key + (param instanceof Array ? '[' + i + ']' : '.' + i);
      paramStr += urlEncode(param[i], k, encode);
    }
  }
  return paramStr;
}

/**
 * @desc url参数截取
 *
 * @param key String 截取key
 *
 * @returns String 参数结果
 */
function getParameter(key) {
  var reg = new RegExp('(^|&)' + key + '=([^&]*)(&|$)', 'i');
  var r = window.location.search.substr(1).match(reg);
  if (r != null) {
    return decodeURIComponent(r[2]);
  }
  return null;
}

/**
 * @desc 获取url中的所有参数
 *
 * @returns String 参数结果
 */
function getAllParameter() {
  // 获取url中"?"符后的字串
  var url = location.search;
  var theRequest = {};
  if (url.indexOf('?') !== -1) {
    var str = url.substr(1);
    var strs = str.split('&');
    for (var i = 0; i < strs.length; i++) {
      theRequest[strs[i].split('=')[0]] = unescape(strs[i].split('=')[1]);
    }
  }
  return theRequest;
}

/**
 * 微信浏览器首次加载页面初始化title后，就再也不监听 document.title的change事件
 * 给页面加上一个内容为空的iframe，随后立即删除这个iframe，这时候会刷新title
 * @param title
 */
function setWeichatDocumentTitle(title) {
  document.title = title;
  var frame = document.createElement('iframe');
  frame.src = '/favicon.ico';
  frame.style.display = 'none';
  frame.onload = function () {
    setTimeout(() => {
      frame.remove();
    }, 9);
  };
  document.body.appendChild(frame);
}

/**
 * 校验用户姓名（包含少数名族）
 *
 * @param userName 截取key
 *
 * @returns Boolean 校验结果
 */
function verifyName(userName) {
  // 校验表达式
  var userNameIdentify = /^[\u4e00-\u9fa5]+(·[\u4e00-\u9fa5]+)*$/;
  return userNameIdentify.test(userName);
}

/**
 * @desc 校验手机号
 *
 * @param mobile 手机号码
 *
 * @returns Boolean 校验结果 
 */
function verifyPhone(mobile) {
  // 校验表达式
  var mobileIdentify = /^1[3|4|5|6|7|8|9]\d{9}$/;
  return mobileIdentify.test(mobile);
}

/**
 * @desc 校验6位数字验证码
 *
 * @param code 验证码
 *
 * @returns Boolean 校验结果
 */
function verifyCheckCode(code) {
  // // 校验表达式
  // var checkCodeIdentify = /\d{6}/;
  // return checkCodeIdentify.test(code);
  var reg = new RegExp("^[0-9]{6}$");

  return reg.test(code);

}

/**
 * @desc 校验身份证号码
 *
 * @param code 身份证号码
 *
 * @returns Boolean 校验结果
 */
// function verifyIDCard(code) {
//   var city = {
//     11: '北京',
//     12: '天津',
//     13: '河北',
//     14: '山西',
//     15: '内蒙古',
//     21: '辽宁',
//     22: '吉林',
//     23: '黑龙江',
//     31: '上海',
//     32: '江苏',
//     33: '浙江',
//     34: '安徽',
//     35: '福建',
//     36: '江西',
//     37: '山东',
//     41: '河南',
//     42: '湖北 ',
//     43: '湖南',
//     44: '广东',
//     45: '广西',
//     46: '海南',
//     50: '重庆',
//     51: '四川',
//     52: '贵州',
//     53: '云南',
//     54: '西藏',
//     61: '陕西',
//     62: '甘肃',
//     63: '青海',
//     64: '宁夏',
//     65: '新疆',
//     71: '台湾',
//     81: '香港',
//     82: '澳门',
//     91: '国外 '
//   };
//   /* eslint-disable no-unused-vars */
//   var tip = '';
//   var pass = true;
//   if (!code || !/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i.test(code)) {
//     tip = '身份证号格式错误';
//     pass = false;
//   } else if (!city[code.substr(0, 2)]) {
//     tip = '地址编码错误';
//     pass = false;
//   } else {
//     // 18位身份证需要验证最后一位校验位
//     if (code.length === 18) {
//       code = code.split('');
//       // ∑(ai×Wi)(mod 11)
//       // 加权因子
//       var factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
//       // 校验位
//       var parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2];
//       var sum = 0;
//       var ai = 0;
//       var wi = 0;
//       for (var i = 0; i < 17; i++) {
//         ai = code[i];
//         wi = factor[i];
//         sum += ai * wi;
//       }
//       if (parity[sum % 11] !== parseInt(code[17])) {
//         tip = '校验位错误';
//         pass = false;
//       }
//     }
//   }
//   return pass;
// }
// 验证身份证号
function verifyIDCard(card) {
  // 身份证号码为15位或者18位，15位时全为数字，18位前17位为数字，最后一位是校验位，可能为数字或字符X 
  var cardReg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
  if (!cardReg.test(card)) {
    return false;
  } else {
    return true;
  }
}
/***
 * 纯数字校验
 * @param code 待校验变量
 * @returns {boolean} 校验结果
 */
function verifyPureNum(code) {
  var regExpression = /^[0-9]*$/;
  return regExpression.test(code);
}
/**
 * @desc 校验银行卡号
 *
 * @param code 银行卡号
 *
 * @returns Boolean 校验结果
 */
function verifyBankCard(code) {
  let bankCardNumberIdentify = /^(\d{16}|\d{19})$/;
  return bankCardNumberIdentify.test(code);
}

/***
 * 解析url
 * @param url 统一资源定位符
 * @returns {{source: *, protocol, host: (*|string), port, origin, query: (*|string|Symbol|string), file: *, hash, path: string, relative: string, segments: Array, params}}
 */
function parseURL(url) {
  var a = document.createElement('a');
  a.href = url;
  /* eslint no-useless-escape: 0 */
  /* eslint no-sparse-arrays: 0 */
  return {
    source: url,
    protocol: a.protocol.replace(':', ''),
    host: a.hostname,
    port: a.port,
    origin: a.origin,
    query: a.search,
    file: (a.pathname.match(/\/([^\/?#]+)$/i) || [, ''])[1],
    hash: a.hash.replace('#', ''),
    path: a.pathname.replace(/^([^\/])/, '/$1'),
    relative: (a.href.match(/tps?:\/\/[^\/]+(.+)/) || [, ''])[1],
    segments: a.pathname.replace(/^\//, '').split('/'),
    params: (function () {
      var ret = {};
      var seg = a.search.replace(/^\?/, '').split('&').filter(function (v, i) {
        if (v !== '' && v.indexOf('=')) {
          return true;
        }
      });
      seg.forEach(function (element, index) {
        var idx = element.indexOf('=');
        var key = element.substring(0, idx);
        var val = element.substring(idx + 1);
        ret[key] = val;
      });
      return ret;
    })()
  };
}

export default {
  getDateStr: getDateStr,
  toDateString: toDateString,
  formatTime: formatTime,
  formatNumber: formatNumber,
  getOrigin: getOrigin,
  urlEncode: urlEncode,
  getParameter: getParameter,
  getAllParameter: getAllParameter,
  setWeichatDocumentTitle: setWeichatDocumentTitle,
  verifyName: verifyName,
  verifyPhone: verifyPhone,
  verifyIDCard: verifyIDCard,
  verifyBankCard: verifyBankCard,
  verifyCheckCode: verifyCheckCode,
  verifyPureNum: verifyPureNum,
  formatDateStr: formatDateStr,
  formatDateStandard: formatDateStandard,
  parseURL: parseURL,
  toTimeString: toTimeString
};
